BUUCTF Reverse WriteUp 3
ACTF rome
是个X86平台的exe文件,看了一下main函数的逻辑还算简单
1 | int func() |
看上去就是让你去爆的,写个脚本,出了
1 | import string |
Cae3ar_th4_Gre@t
CrackMe
打开看是个x86下的exe文件,无壳,主函数比较清晰
1 | int wmain() |
od跟一下到了sub_401830
的时候这个username和password有没有变化
好的没变,跟进去看看
1 | bool __usercall check@<al>(int a1@<ebx>, int username, const char *password) |
哇,这个,有点难看啊,初步可以判断出,最上面的data
就是对输入的密码取变成字节,然后下面的一张表变来变去,真的不知道如何是好,跟也跟不出,网站翻了一下writeUp,有反调试,如果是在调试就给进行其他的骚操作,淦
最下面的操作是要让data2 = dbappsec
,但是这个tabel变来变去是真的难受,跟进去看是个272长度的table,自己写个脚本模拟了一下
1 | data = [ |
['N', 'µ', 'ó', '\x99', '#', '\x91', '¡', '®']
,这是人能打出来的?
完全对不上号啊,跟一下每次xor的值吧,反正这个是固定的,只和调试器的状态有关
0x7e 0x98 0xc9 0x95 0x10 0x6d 0xf3 0x67
淦,不对,用OD跟一下
0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd
和我写脚本模拟出来的一摸一样['N', 'µ', 'ó', '\x99', '#', '\x91', '¡', '®']
等等,这个,确实是人能够打出来的,毕竟都转化成字节序列了,试试4eb5f3992391a1ae
好像还是不对,淦,下面函数里面还要和username进行一次xor,好了出了
1 | import hashlib |
试了下密码39d09ffa4cfcc4cc
,出了,但是md5对字节加密,对字符串加密都不对?
nmdwsm,我明明已经关了IDA和OD了啊???
网上找了一下d2be2981b84f2a905669995873d6a36c
,这就是4eb5f3992391a1ae
的md5
出了,结果是来自于-同用户名进行xor的不会被执行,???什么阴间题目
firmware
路由器固件?有点东西,这个没学过是真的不会,网上找找教程,用binwalk
好像也没有搞出个什么东西来,然后按照官方的重新安装了一次binwalk
之后,奇迹出现了,在/tmp
下找到一个名为backdoor
的文件,太明显了下载下来看看
发现是用UPX加壳过的,使用upx脱壳,然后发现主函数非常长,确实是一个后门
逐渐分析到了initConnection
函数
1 | bool initConnection() |
这不就出了嘛echo.byethost51.com:36667
xxor
是个Linux x86_64文件,main函数比较简单
1 | __int64 __fastcall main(__int64 a1, char **a2, char **a3) |
大概就是输入了6个int32的数,然后放在3个int64的数中进行加密操作,最后要等于一个结果,其实可以在网上找找轮子之类的
看一下最后的check
部分
1 | signed __int64 __fastcall check(_DWORD *a1) |
小学生方程,找个计算器就可以解出来结果的值,容我先装个z3,以后总有用
[x = 3774025685, y = 1548802262, z = 2652626477]
解出来6个加密的数分别是
a = {0xDF48EF7E, 0x20CAACF4, 0xe0f30fd5, 0x5c50d8d6, 0x9e1bde2d, 0x84F30420}
然后写个java脚本求解
1 |
|
[-698534522, -1541066437, 1578206992, -287775654, 1339222190, -130761337]
这个是错的
因为java这个int是带符号的,写个C脚本
1 |
|
666c61, 677b72,655f69, 735f67,726561, 74217d
然后hex转str一下flag{re_is_great!}
至此,BUUCTF的1分的题目全部解决,撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。